home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / c / globber.exe / MATCH.LST < prev    next >
File List  |  1991-02-24  |  16KB  |  544 lines

  1. 02-24-91
  2.  
  3. This is V1.01 of REGEX Globber.
  4.  
  5.  
  6. 02-22-91 Seattle, WA
  7.  
  8. Hmm. Choke. (Foot in mouth). After griping about buggy routines and
  9. literally seconds after posting this code the first time,  I received
  10. a wonderful new test evaluation tool which allows you to perform
  11. coverage analysis during testing.  Sure enough I found that about
  12. 25% of the paths in the program were never traversed in my current
  13. test battery.  After swallowing my (overly large) pride and coming
  14. up with a test battery which covered the entire path of the program
  15. I found a couple of minor logic bugs involving literal escapes (\)
  16. within other patterns (ie [..] and * sequences).  I have repackaged
  17. these routines and included also the makefile I use and the test
  18. battery I use to make things a bit easier.
  19.  
  20.                                 jbk
  21.  
  22. 02-20-91 Seattle, WA
  23.  
  24. Here is a *IX wildcard globber I butchered, hacked and cajoled together
  25. after seeing and hearing about and becoming disgusted with several similar
  26. routines which had one or more of the following attributes:  slow, buggy,
  27. required large levels of recursion on matches, required grotesque levels
  28. of recursion on failing matches using '*', full of caveats about usability
  29. or copyrights.
  30.  
  31. I submit this without copyright and with the clear understanding that
  32. this code may be used by anyone, for any reason, with any modifications
  33. and without any guarantees, warrantee or statements of usability of any
  34. sort.
  35.  
  36. Having gotten those cow chips out of the way, these routines are fairly
  37. well tested and reasonably fast.  I have made an effort to fail on all
  38. bad patterns and to quickly determine failing '*' patterns.  This parser
  39. will also do quite a bit of the '*' matching via quick linear loops versus
  40. the standard blind recursive descent.
  41.  
  42. This parser has been submitted to profilers at various stages of development
  43. and has come through quite well.  If the last millisecond is important to
  44. you then some time can be shaved by using stack allocated variables in
  45. place of many of the pointer follows (which may be done fairly often) found
  46. in regex_match and regex_match_after_star (ie *p, *t).
  47.  
  48. No attempt is made to provide general [pat,pat] comparisons.  The specific
  49. subcases supplied by these routines is [pat,text] which is sufficient
  50. for the large majority of cases (should you care).
  51.  
  52. Since regex_match may return one of three different values depending upon
  53. the pattern and text I have made a simple shell for convenience (match()).
  54. Also included is an is_pattern routine to quickly check a potential pattern
  55. for regex special characters.  I even placed this all in a header file for
  56. you lazy folks!
  57.  
  58. Having said all that, here is my own reinvention of the wheel.  Please
  59. enjoy it's use and I hope it is of some help to those with need ....
  60.  
  61.  
  62.                                 jbk
  63.  
  64.  
  65. ==================== BEGIN of Listing ====================
  66.  
  67.  
  68. Checksum: 2543766536   (verify or update this with "brik")
  69.  
  70.  
  71. ==================== MATCHMAK ====================
  72.  
  73. #
  74. #
  75. # Makefile for match.c
  76. #
  77. # Created 01-20-91 JBK
  78. # Last Modified 02-13-91 JBK
  79. #
  80. #
  81.  
  82. CC = cl
  83.  
  84. #
  85. # This is FLAGS for optimized version
  86. #FLAGS = /c /AL /G0 /F 0FFF /Ox /W4
  87.  
  88. #
  89. # This is FLAGS for optimized version with main
  90. #FLAGS = /D TEST /AL /G0 /F 0FFF /Ox /W4
  91.  
  92. #
  93. # This is FLAGS for debugging versions with main
  94. FLAGS = /D TEST /AL /G0 /F 0FFF /Od /W4 /Zi /qc
  95.  
  96.  
  97. match.exe: match.c match.h
  98.     $(CC) $(FLAGS) match.c
  99.  
  100.  
  101.  
  102.  
  103. ==================== MATCHTST.BAT ====================
  104.  
  105. @echo The following tests should match
  106. match test? testy
  107. match test* test
  108. match tes*t test
  109. match *test test
  110. match t*s*t test
  111. match t*s*t tesseract
  112. match t?s? test
  113. match ?s*t psyot
  114. match [a-z]s*t asset
  115. match s[!gh]t set
  116. match t[a-ce]st test
  117. match tea[ea-c]up teacup
  118. match [a-fh-z]* jack
  119. match \i\** i*hello
  120. match [\[-\]] [
  121. match [a-z\\] \
  122. match [a-z%_] b
  123. match [\]] ]
  124. match \i?* itch
  125. match \i?* it
  126. match ?*?*?t test
  127. match ?*?*?*?* test
  128. match *\]*\**\?*\[ ]this*is?atest[
  129.  
  130. @echo The following tests should fail
  131. match hello
  132. match test test
  133. match \ test
  134. match t*s*t texxeract
  135. match t?st tst
  136. match test? test
  137. match s[!e]t set
  138. match [] ]
  139. match [ [
  140. match [\[-\] [
  141. match [a atest
  142. match [a- atest
  143. match [a-z atest
  144. match [a-]* atest
  145. match [a-fh-z jack
  146. match [a-fh-z\] jack
  147. match [a-fh-z] jack
  148. match ?*?*?t*? test
  149. match *????? test
  150.  
  151.  
  152.  
  153.  
  154. ==================== MATCH.H ====================
  155.  
  156. /*
  157.  EPSHeader
  158.  
  159.    File: match.h
  160.    Author: J. Kercheval
  161.    Created: Sat, 01/05/1991  22:27:18
  162. */
  163. /*
  164.  EPSRevision History
  165.  
  166.    J. Kercheval  Wed, 02/20/1991  22:28:37  Released to Public Domain
  167. */
  168.  
  169. /*
  170.    Wildcard Pattern Matching
  171. */
  172.  
  173. #ifndef BOOLEAN
  174. # define BOOLEAN int
  175. # define TRUE 1
  176. # define FALSE 0
  177. #endif
  178.  
  179. /*----------------------------------------------------------------------------
  180. *
  181. *  Match the pattern PATTERN against the string TEXT;
  182. *  return TRUE if it matches, FALSE otherwise.
  183. *
  184. *  A match means the entire string TEXT is used up in matching.
  185. *
  186. *  In the pattern string:
  187. *       `*' matches any sequence of characters
  188. *       `?' matches any character
  189. *       [SET] matches any character in the specified set,
  190. *       [!SET] or [^SET] matches any character not in the specified set.
  191. *
  192. *  Note: the standard regex character '+' (one or more) should by
  193. *        simulated by using "?*" which is equivelant here.
  194. *
  195. *  A set is composed of characters or ranges; a range looks like
  196. *  character hyphen character (as in 0-9 or A-Z).  [0-9a-zA-Z_] is the
  197. *  minimul set of characters allowed in the [..] pattern construct.
  198. *  Other characters are allowed (ie. 8 bit characters) if your system
  199. *  will support them.
  200. *
  201. *  To suppress the special syntactic significance of any of `[]*?!^-\',
  202. *  and match the character exactly, precede it with a `\'.
  203. *
  204. ----------------------------------------------------------------------------*/
  205.  
  206. BOOLEAN match (char *pattern, char *text);
  207.  
  208. /*----------------------------------------------------------------------------
  209. *
  210. * Return TRUE if PATTERN has any special wildcard characters
  211. *
  212. ----------------------------------------------------------------------------*/
  213.  
  214. BOOLEAN is_pattern (char *pattern);
  215.  
  216.  
  217.  
  218.  
  219. ==================== MATCH.C ====================
  220.  
  221. /*
  222.  EPSHeader
  223.  
  224.    File: match.c
  225.    Author: J. Kercheval
  226.    Created: Sat, 01/05/1991  22:21:49
  227. */
  228. /*
  229.  EPSRevision History
  230.  
  231.    J. Kercheval  Wed, 02/20/1991  22:29:01  Released to Public Domain
  232.    J. Kercheval  Fri, 02/22/1991  15:29:01  fix '\' bugs (two :( of them)
  233. */
  234.  
  235. /*
  236.    Wildcard Pattern Matching
  237. */
  238.  
  239.  
  240. #include "match.h"
  241.  
  242. #define ABORT 2     /* end of search indicator */
  243.  
  244. BOOLEAN regex_match_after_star (char *pattern, char *text);
  245.  
  246. /*----------------------------------------------------------------------------
  247. *
  248. * Return TRUE if PATTERN has any special wildcard characters
  249. *
  250. ----------------------------------------------------------------------------*/
  251.  
  252. BOOLEAN is_pattern (char *p)
  253. {
  254.     while ( *p ) {
  255.         switch ( *p++ ) {
  256.             case '?':
  257.             case '*':
  258.             case '[':
  259.                 return TRUE;
  260.             case '\\':
  261.                 if ( !*p++ ) return FALSE;
  262.         }
  263.     }
  264.     return FALSE;
  265. }
  266.  
  267.  
  268. /*----------------------------------------------------------------------------
  269. *
  270. *  Match the pattern PATTERN against the string TEXT;
  271. *  return TRUE if it matches, FALSE otherwise.
  272. *
  273. *  A match means the entire string TEXT is used up in matching.
  274. *
  275. *  In the pattern string:
  276. *       `*' matches any sequence of characters
  277. *       `?' matches any character
  278. *       [SET] matches any character in the specified set,
  279. *       [!SET] or [^SET] matches any character not in the specified set.
  280. *
  281. *  Note: the standard regex character '+' (one or more) should by
  282. *        simulated by using "?*" which is equivelant here.
  283. *
  284. *  A set is composed of characters or ranges; a range looks like
  285. *  character hyphen character (as in 0-9 or A-Z).  [0-9a-zA-Z_] is the
  286. *  minimul set of characters allowed in the [..] pattern construct